home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Utilities / Workspace / Locus / Source / MainController.m < prev    next >
Text File  |  1995-06-12  |  14KB  |  594 lines

  1.  
  2. /*
  3.     Copyright 1993  Jeremy Slade.
  4.  
  5.     You are free to use all or any parts of the Locus project
  6.     however you wish, just give credit where credit is due.
  7.     The author (Jeremy Slade) shall not be held responsible
  8.     for any damages that result out of use or misuse of any
  9.     part of this project.
  10.  
  11. */
  12.  
  13. /*
  14.     Project: Locus
  15.  
  16.     File: MainController.m
  17.  
  18.     Description: See MainController.h
  19.  
  20.     Original Author: Jeremy Slade
  21.  
  22.     Revision History:
  23.         Created
  24.             V.101    JGS Tue Feb  2 18:05:03 GMT-0700 1993
  25.  
  26. */
  27.  
  28.  
  29. #import "MainController.h"
  30.  
  31. #import "Activator.h"
  32. #import "AtomList.h"
  33. #import "Folder.h"
  34. #import "FolderController.h"
  35. #import "FolderViewer.h"
  36. #import "Globals.h"
  37. #import "Group.h"
  38. #import "InfoPanel.h"
  39. #import "Inspector.h"
  40. #import "Preferences.h"
  41. #import "PSWraps.h"
  42.  
  43. #import <dpsclient/dpsclient.h>
  44. #import <dpsclient/wraps.h>
  45. #import <libc.h>
  46. #import <objc/List.h>
  47. #import <objc/NXStringTable.h>
  48. #import <stdio.h>
  49. #import <stdlib.h>
  50. #import <string.h>
  51.  
  52.  
  53. // Flag set by -barHit:
  54. BOOL viewersBuried = NO;
  55.  
  56. // Flag used when app is initially launched
  57. BOOL stillLaunching = NO;
  58.  
  59. // Flag set by -appDidBecomeActive:
  60. BOOL stillActivating = NO;
  61.  
  62.  
  63.  
  64. @implementation MainController : Object
  65.  
  66.  
  67. + initialize
  68. /*
  69.     Set the class version number
  70.     Initialize the defaults
  71. */
  72. {
  73.     [self setVersion:MainController_VERSION];
  74.     
  75.     PSInitWraps(); // Initialize custom PostScript code
  76.     
  77.     NXRegisterDefaults ( [NXApp appName], Defaults );
  78.     NXUpdateDefaults();
  79.     
  80.     return ( self );
  81. }
  82.  
  83.  
  84.  
  85. - init
  86. {
  87.     [super init];
  88.     mainController = self;
  89.     return ( self );
  90. }
  91.  
  92.  
  93.  
  94. - free
  95. {
  96.     // Should free its instance variables, but it only gets freed when
  97.     // the app terminates, so I didn't worry about it
  98.  
  99.     return ( [super free] );
  100. }
  101.  
  102.  
  103.  
  104. // -------------------------------------------------------------------------
  105. //   Application Delegate Methods
  106. // -------------------------------------------------------------------------
  107.  
  108.  
  109. - appWillInit:sender
  110. {
  111.     // Initialize global variables
  112.     // initGlobals should'nt be called until this point, after Main.nib
  113.     // has been loaded
  114.     mainController = self;
  115.     folderController = theFolderController;
  116.     initGlobals();
  117.     
  118.     // Read the preferences
  119.     [self readPrefs:self];
  120.     
  121.     stillLaunching = YES;
  122.     return ( self );
  123. }
  124.  
  125.  
  126.  
  127. - appDidInit:sender
  128. {
  129.     [folderController setup];
  130.     [self showActivator:self];
  131.  
  132.     // Do AutolLaunch stuff if NXAutoLaunch = YES
  133.     if ( isAutoLaunch ) {
  134.         if ( autolaunchHide ) {
  135.             [NXApp hide:self];
  136.             [folderController perform:@selector(inactive:)
  137.                 with:self afterDelay:1 cancelPrevious:YES];
  138.         } else
  139.             [NXApp activateSelf:YES];
  140.     }
  141.     
  142.     stillLaunching = NO; // All done with initial setup
  143.     return ( self );
  144. }
  145.  
  146.  
  147.     
  148. - appWillTerminate:sender
  149. {
  150.     if ( ![folderController cleanup] ) return ( nil );
  151.         else return ( self );
  152. }
  153.  
  154.  
  155.  
  156. - appDidResignActive:sender
  157. {
  158.     [folderController inactive:self];
  159.     return ( self );
  160. }
  161.  
  162.  
  163.  
  164. - appDidBecomeActive:sender
  165. {
  166.     int i, count;
  167.     id windowList;
  168.     
  169.     // Move all Folder viewer to front of the screenlist.
  170.     // They could be at the back of the screen if they were 'buried'
  171.     if ( viewersBuried ) {
  172.         windowList = [NXApp windowList];
  173.         count = [windowList count];
  174.         for ( i=0; i<count; i++ )
  175.             if ( [[windowList objectAt:i] class] == [FolderViewer class] )
  176.                 [[windowList objectAt:i] orderFront:self];
  177.         viewersBuried = NO;
  178.     }
  179.     
  180.     if ( !stillLaunching ) {
  181.         stillActivating = YES;
  182.         [self perform:@selector(doneActivating:)
  183.             with:self
  184.             afterDelay:1
  185.             cancelPrevious:NO];
  186.     }
  187.     
  188.     [folderController active:sender];
  189.     return ( self );
  190. }
  191.  
  192.  
  193.  
  194. - appDidHide:sender
  195. /*
  196.     Called immed. after the app is hidden.   Make sure the Activator stays visible.
  197. */
  198. {
  199.     [self showActivator:self];
  200.     return ( self );
  201. }
  202.  
  203.  
  204.  
  205. - (int)app:sender openFile:(const char *)filename type:(const char *)aType
  206. /*
  207.     Responds to requests from NXApp to open a Folder specified by filename
  208. */
  209. {
  210.     if ( strcmp ( aType, FOLDER_EXT ) )
  211.         return ( NO ); // Invalid file type
  212.  
  213.     // Filename is a folder -- open it if not already open; if it is open,
  214.     // make it the key folder
  215.     if ( [folderController folderLoaded:filename] ) {
  216.         [folderController makeKeyFolder:[folderController folderWithFilename:filename]];
  217.         return ( YES );
  218.     }
  219.     
  220.     if ( [folderController openFolder:filename] ) {
  221.         [folderController active:self];
  222.         return ( YES );
  223.     }
  224.         
  225.     return ( NO );
  226. }
  227.  
  228.  
  229.  
  230. - (BOOL)appAcceptsAnotherFile:sender
  231. {
  232.     return ( YES ); // Should always be able to open another folder
  233. }
  234.         
  235.  
  236.  
  237. - powerOff:(NXEvent *)theEvent
  238. {
  239.     [folderController saveAllFolders:self];
  240.     [self appWillTerminate:self];
  241.     return ( self );
  242. }
  243.  
  244.  
  245.  
  246. - app:sender powerOffIn:(int)ms andSave:(BOOL)aFlag
  247. {
  248.     [folderController saveAllFolders:self];
  249.     [self appWillTerminate:self];
  250.     return ( self );
  251. }
  252.  
  253.  
  254.  
  255.  
  256. // -------------------------------------------------------------------------
  257. //   Info panel
  258. // -------------------------------------------------------------------------
  259.  
  260.  
  261. - showInfoPanel:sender
  262. {
  263.     // Load nib section if not already done
  264.     if ( !infoPanel ) {
  265.         [NXApp loadNibSection:"Info.nib"
  266.             owner:self
  267.             withNames:NO];
  268.         [infoPanel setDelegate:self];
  269.     }
  270.     
  271.     [infoPanel runInfoPanel:self];    
  272.     return ( self );
  273. }
  274.  
  275.  
  276.  
  277. // -------------------------------------------------------------------------
  278. //   Preferences
  279. // -------------------------------------------------------------------------
  280.  
  281.  
  282. - showPrefsPanel:sender
  283. {
  284.     // Create the Prefs panel if necessary
  285.     if ( !preferences ) {
  286.         preferences = [[Preferences alloc] init];
  287.     }
  288.             
  289.     [[[preferences displayPrefs] panel] makeKeyAndOrderFront:self];
  290.     return ( self );
  291. }
  292.  
  293.  
  294.  
  295. - readPrefs:sender
  296. {
  297.     char str[101];
  298.     const char *s, *folders, *tab;
  299.     char path[MAXPATHLEN+1];
  300.     int mode, m;
  301.     float red, green, blue;
  302.  
  303.     NXUpdateDefaults ();
  304.  
  305.     /*
  306.         Read system defaults
  307.     */
  308.     
  309.     if ( (s = NXGetDefaultValue ( [NXApp appName], "NXAutoLaunch" )) ) {
  310.         isAutoLaunch = (!strcasecmp ( s, "YES" )) ? YES : NO;
  311.     } else
  312.         isAutoLaunch = NO;
  313.     
  314.     
  315.     /*
  316.         Read Application defaults
  317.     */
  318.  
  319.     // Read 'Hide on AutoLaunch'    
  320.     autolaunchHide = (!strcasecmp ( NXGetDefaultValue ( [NXApp appName],
  321.         PREF_AUTOLAUNCH_HIDE ), "YES" )) ? YES : NO;
  322.     
  323.     // Read Activator Mask
  324.     activatorMask = atoi ( NXGetDefaultValue ( [NXApp appName],
  325.         PREF_ACTIVATOR_MASK ) );
  326.     [activator setBar:activatorMask on:YES];
  327.         
  328.     // Read 'Floating activator'
  329.     floatActivator = (!strcasecmp ( NXGetDefaultValue ( [NXApp appName],
  330.         PREF_ACTIVATOR_FLOAT ), "YES" )) ? YES : NO;
  331.     [activator setFloating:floatActivator];
  332.     
  333.     // Read Activator Fill Color
  334.     strcpy ( str, NXGetDefaultValue ( [NXApp appName],
  335.         PREF_ACTIVATOR_COLOR ) );
  336.     sscanf ( str, "%f%f%f", &red, &green, &blue );
  337.     activatorFillColor = NXChangeRedComponent ( activatorFillColor, red );
  338.     activatorFillColor = NXChangeGreenComponent ( activatorFillColor, green );
  339.     activatorFillColor = NXChangeBlueComponent ( activatorFillColor, blue );
  340.     activatorFillColor =
  341.             NXChangeAlphaComponent ( activatorFillColor, NX_NOALPHA );
  342.     [activator setColor:activatorFillColor];
  343.         
  344.     // Read Activator Border Color
  345.     strcpy ( str, NXGetDefaultValue ( [NXApp appName],
  346.         PREF_ACTIVATOR_BORDER ) );
  347.     sscanf ( str, "%f%f%f", &red, &green, &blue );
  348.     activatorBorderColor = NXChangeRedComponent ( activatorBorderColor, red );
  349.     activatorBorderColor =
  350.             NXChangeGreenComponent ( activatorBorderColor, green );
  351.     activatorBorderColor =
  352.             NXChangeBlueComponent ( activatorBorderColor, blue );
  353.     activatorBorderColor =
  354.             NXChangeAlphaComponent ( activatorBorderColor, NX_NOALPHA );
  355.     [activator setBorderColor:activatorBorderColor];
  356.  
  357.     // Read default viewer frame
  358.     strcpy ( str, NXGetDefaultValue ( [NXApp appName], PREF_VIEWER_FRAME ) );
  359.     sscanf ( str, "%f%f%f%f",
  360.             &defaultViewerFrame.origin.x,
  361.             &defaultViewerFrame.origin.y,
  362.             &defaultViewerFrame.size.width,
  363.             &defaultViewerFrame.size.height );
  364.     
  365.     // Read verifyActions
  366.     verifyActions = (!strcasecmp ( NXGetDefaultValue ( [NXApp appName],
  367.             PREF_VERIFY ), "YES" )) ? YES : NO;
  368.     
  369.     // read autoSave
  370.     autoSave = (!strcasecmp ( NXGetDefaultValue ( [NXApp appName],
  371.             PREF_AUTOSAVE ), "YES" )) ? YES : NO;
  372.  
  373.     // read activatorAdd
  374.     activatorAdd = (!strcasecmp ( NXGetDefaultValue ( [NXApp appName],
  375.             PREF_ADD_ACTIVATOR ), "YES" )) ? YES : NO;
  376.     [activator setDraggingEnabled:activatorAdd];
  377.  
  378.     // read appIconAdd
  379.     appIconAdd = (!strcasecmp ( NXGetDefaultValue ( [NXApp appName],
  380.             PREF_ADD_APPICON ), "YES" )) ? YES : NO;
  381.     [appIconView setDraggingEnabled:appIconAdd];
  382.  
  383.     // read inspectorMode
  384.     strcpy ( str, NXGetDefaultValue ( [NXApp appName], PREF_INSPECTORMODE ) );
  385.     mode = m = INSPECT_NONE;
  386.     while ( inspectorTitles[m] ) {
  387.         if ( !strcasecmp ( str, inspectorTitles[m] ) ) {
  388.             mode = m;
  389.             break;    // Break out of while loop
  390.         } else m++;
  391.     }
  392.     if ( inspector && [inspector inspectorMode] != INSPECT_NONE )
  393.         [inspector setInspectorMode:mode];
  394.     else
  395.         inspectorMode = mode;
  396.     
  397.     // read inspectorLocation
  398.     strcpy ( str, NXGetDefaultValue ( [NXApp appName],
  399.             PREF_INSPECTORLOCATION ) );
  400.     sscanf ( str, "%f %f", &inspectorLocation.x, &inspectorLocation.y );
  401.     
  402.     // read hideDeactive
  403.     hideDeactive = (!strcasecmp ( NXGetDefaultValue ( [NXApp appName],
  404.             PREF_HIDEDEACTIVE ), "YES" )) ? YES : NO;
  405.  
  406.     // read startupFolders
  407.     if ((folders=NXGetDefaultValue ( [NXApp appName], PREF_STARTUPFOLDERS))) {
  408.         
  409.         // Empty the old list of startupFolders
  410.         if ( startupFolders ) [startupFolders free];
  411.         
  412.         // Create a new list
  413.         startupFolders = [[AtomList alloc] init];
  414.  
  415.         // folders is a tab-separated list of file names
  416.         if ( folders[0] != '\0' ) do {
  417.             // Read the next path
  418.             sscanf ( folders, "%[^\t]", path ); // Read until next tab
  419.  
  420.             // Add the path to startupFolders
  421.             [startupFolders addAtom:
  422.                 NXUniqueString([folderController relativePathForFolder:path])];
  423.             
  424.             // Move folders to next path in list
  425.             tab = index ( folders, '\t' ); // Find next tab
  426.             if ( tab ) folders = tab + 1;
  427.                 else folders = NULL;
  428.         } while ( folders ); // Read all the paths in the list
  429.     }
  430.     
  431.     return ( self );
  432. }
  433.  
  434.  
  435.  
  436. - writePrefs:sender
  437. {
  438.     char str[101];
  439.     NXStream *stream;
  440.     char *buf;
  441.     int len, mlen;
  442.     int i, count;
  443.     float red, green, blue;
  444.  
  445.     // Write 'Hide on autoLaunch'
  446.     NXWriteDefault ( [NXApp appName], PREF_AUTOLAUNCH_HIDE,
  447.             autolaunchHide ? "YES" : "NO" );
  448.     
  449.     // Write activator bar mask
  450.     sprintf ( str, "%d", activatorMask );
  451.     NXWriteDefault ( [NXApp appName], PREF_ACTIVATOR_MASK, str );
  452.     
  453.     // Write 'Floating activation bar'
  454.     NXWriteDefault ( [NXApp appName], PREF_ACTIVATOR_FLOAT,
  455.             floatActivator ? "YES" : "NO" );
  456.     
  457.     // Write activator fill color
  458.     NXConvertColorToRGB ( activatorFillColor, &red, &green, &blue );
  459.     sprintf ( str, "%f %f %f", red, green, blue );
  460.     NXWriteDefault ( [NXApp appName], PREF_ACTIVATOR_COLOR, str );
  461.  
  462.     // Write activator border color
  463.     NXConvertColorToRGB ( activatorBorderColor, &red, &green, &blue );
  464.     sprintf ( str, "%f %f %f", red, green, blue );
  465.     NXWriteDefault ( [NXApp appName], PREF_ACTIVATOR_BORDER, str );
  466.  
  467.     // Write default viewer frame
  468.     sprintf ( str, "%.0f %.0f %.0f %.0f",
  469.             defaultViewerFrame.origin.x,
  470.             defaultViewerFrame.origin.y,
  471.             defaultViewerFrame.size.width,
  472.             defaultViewerFrame.size.height );
  473.     NXWriteDefault ( [NXApp appName], PREF_VIEWER_FRAME, str );
  474.     
  475.     // Write verifyActions
  476.     NXWriteDefault ( [NXApp appName], PREF_VERIFY,
  477.             verifyActions ? "YES" : "NO" );
  478.     
  479.     // Write autoSave
  480.     NXWriteDefault ( [NXApp appName], PREF_AUTOSAVE,
  481.             autoSave ? "YES" : "NO" );
  482.     
  483.     // Write hideDeactive
  484.     NXWriteDefault ( [NXApp appName], PREF_HIDEDEACTIVE,
  485.             hideDeactive ? "YES" : "NO" );
  486.     
  487.     // Write activatorAdd
  488.     NXWriteDefault ( [NXApp appName], PREF_ADD_ACTIVATOR,
  489.             activatorAdd ? "YES" : "NO" );
  490.     [activator setDraggingEnabled:activatorAdd];
  491.  
  492.     // Write appIconAdd
  493.     NXWriteDefault ( [NXApp appName], PREF_ADD_APPICON,
  494.             appIconAdd ? "YES" : "NO" );
  495.     
  496.     // Write startupFolders
  497.     if ( (stream = NXOpenMemory ( NULL, 0, NX_WRITEONLY )) ) {
  498.         // Open a stream to buffer the paths
  499.         // Write all the paths in startupFolders to the stream
  500.         // as a tab-separated list (NXFilenamePboardType format)
  501.         count = [startupFolders count];
  502.         for ( i=0; i<count; i++ )
  503.             if ( i ) NXPrintf ( stream, "\t%s", [startupFolders atomAt:i] );
  504.                 else NXPrintf ( stream, "%s", [startupFolders atomAt:i] );
  505.  
  506.         // Get a pointer to the buffer
  507.         NXGetMemoryBuffer ( stream, &buf, &len, &mlen );
  508.         
  509.         // Write the buffer to the defaults database
  510.         NXWriteDefault ( [NXApp appName], PREF_STARTUPFOLDERS, buf );
  511.         
  512.         // Close the stream and free the buffer
  513.         NXCloseMemory ( stream, NX_FREEBUFFER );
  514.     }
  515.  
  516.     return ( self );
  517. }
  518.  
  519.  
  520.     
  521. // -------------------------------------------------------------------------
  522. //   Activator
  523. // -------------------------------------------------------------------------
  524.  
  525.  
  526. - showActivator:sender
  527. {
  528.     [activator show:self];
  529.     return ( self );
  530. }
  531.  
  532.  
  533.  
  534. - hideActivator:sender
  535. {
  536.     [activator hide:self];
  537.     return ( self );
  538. }
  539.  
  540.  
  541.  
  542. - activatorHit:sender
  543. /*
  544.     Delegate method of the Activator, sent when it is clicked in.  If Locus is inactive, this will cause it to activate.  If it is already active, this causes Locus to deactivate.
  545. */
  546. {
  547.     int i, count;
  548.     id windowList;
  549.     
  550.     [self showActivator:self];
  551.     
  552.     if ( !stillActivating ) { // The bar was hit when we were already active
  553.     
  554.         // 'Bury' viewers by moving them to the back of the screen list
  555.         // This only needs to be done if they aren't automatically hidden
  556.         // when the app deactivates
  557.         if ( !hideDeactive ) {
  558.             windowList = [NXApp windowList];
  559.             count = [windowList count];
  560.             for ( i=0; i<count; i++ )
  561.                 if ( [[windowList objectAt:i] class] == [FolderViewer class] )
  562.                     [[windowList objectAt:i] orderBack:self];
  563.             viewersBuried = YES;
  564.         }
  565.  
  566.         [NXApp deactivateSelf];
  567.     }
  568.                 
  569.     return ( self );
  570. }
  571.  
  572.  
  573.  
  574. - activator
  575. {
  576.     return ( activator );
  577. }
  578.  
  579.  
  580.  
  581. - doneActivating:sender
  582. {
  583.     // - doneActivating: is called through a delayed perform
  584.     // immed. after the app activates... by the time it actually
  585.     // gets called, everything should have been taken care of...
  586.     stillActivating = NO;
  587.     return ( self );
  588. }
  589.  
  590.  
  591.  
  592. @end
  593.  
  594.